package com.example.juc.big_talk_concurrent.chapter2.article2;

import java.util.concurrent.TimeUnit;

public class MonitorExample {
    int a = 0;

    public synchronized void writer() { // 1
        a++; //2
    }//3

    public synchronized void reader() {//4
        int i = a;//5
        System.out.println(i);
    }//6

    public static void main(String[] args) throws InterruptedException {
        MonitorExample monitorExample = new MonitorExample();

        new Thread(() -> {
            monitorExample.writer();
        }, "A").start();

        // 确保reader方法的执行在时间上晚于writer方法，使得2先行发生于5的规则得以满足
        TimeUnit.MILLISECONDS.sleep(100);

        new Thread(() -> {
            monitorExample.reader();
        }, "B").start();

        // 线程 A 在释放锁之前对共享变量做的所有修改，在线程 B 获取同一个锁之后，将立刻对线程 B 可见。
    }
}
